package thread;

/**
 * 线程提供了一个方法:
 * void join()
 * 该方法允许一个线程在另一个线程上等待，直到其执行完毕后才会继续后续的工作。
 * 所有join方法可以协调线程之间的同步运行。
 * <p>
 * 同步运行:多个线程执行存在先后顺序。
 * 异步运行:多个线程执行时各干各的。
 * ------线程之间本来就是异步运行的.
 */
public class JoinDemo {
    public static boolean isFinish = false;//标示图片是否下载完毕.
    public static void main(String[] args) {
        /*
            当一个方法的局部变量被该方法的其他内部类引用时，这个局部变量必须是final的。
            JDK8之后可以不显示的用final关键词修饰该变量，但是该特点依然存在.
         */
//        boolean isFinish = false;//从内部类访问变量“isFinish”，需要是最终的或有效的最终
        Thread download = new Thread() {
            public void run() {
                System.out.println("down:开始下载...");
                for (int i = 0; i <= 100; i++) {
                    System.out.println("down:" + i + "%");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                    }
                }
                System.out.println("down:下载完毕!");
                isFinish = true;
            }
        };
        Thread show = new Thread(){
            public void run(){
                try {
                    System.out.println("show:开始显示文字...");
                    Thread.sleep(5000);
                    System.out.println("show:文字显示完毕~");
                    /*
                        等待download下载完毕(阻塞show线程等待download执行完毕)
                     */
                    System.out.println("show:等待下载图片...");
                    download.join();//等待线程死亡,结束
                    System.out.println("show:等待结束！");

                    System.out.println("show:开始显示图片...");
                    if(!isFinish){
                        /** 抛出新的运行时异常 */
                        throw new RuntimeException("show:图片加载失败~");//当向外抛出时,该线程会被直接杀掉,但不影响其他线程.
                    }
                    System.out.println("show:显示图片~");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        show.start();
        download.start();
    }
}
